import { createApp } from './ssr-entry'


export default context => {
  // 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
    // 以便服务器能够等待所有的内容在渲染前，
    // 就已经准备就绪。
  return new Promise((resolve, reject) => {
    const { app, router, store } = createApp()

    // 设置服务器端 router 的位置
    router.push(context.url)

    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，就返回
      if (!matchedComponents.length) return {code: 404}
      
      Promise.all(matchedComponents.map( Component => {

        let asyncData
        try {
          asyncData = Component.extendOptions.asyncData || Component.extendOptions.methods.asyncData
        } catch (e) {}
        

        if (asyncData) {
          return asyncData({
            store,
            options: {lang: context.lang, token: context.token}
          })
        }
      } )).then(() => {
        context.state = store.state
        resolve(app)
      }).catch(reject)
    }, reject)
  })
}